﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame1
{
    class Coordonées //classe qui permet seulement d'accéderv aux coordonnées plus facilement (un vector2 entier)
    {
        int _x, _y;
        public Coordonées(int X, int Y)
        {
            _x = X;
            _y = Y;
        }
        public int x
        {
            get { return this._x; }
            set { this._x = value; }
        }
        public int y
        {
            get { return this._y; }
            set { this._y = value; }
        }
        public static void est_allumee(Vector2 souris)//reçoit les coordonnées de la souris
        {
          
            double j = fonctions.fcdroite(souris, true);
            double i = fonctions.fcdroite(souris, false);
            if (j <= 0 && i >= 0)
            {
                Coordonées res = fonctions.coor(souris);
  
            }


        }
    }
  
     class Carte
    { //ATTRIBUTS
         Case[,] carte;
        int _longueur, _hauteur;
        
         

         //MEthodes
        public void déplacement(Coordonées départ, Coordonées arrivée) //déplace le personnage de (x,y) en (toX,toY) (si possible)
       {
           if (départ.x >= 0 && départ.x< hauteur && départ.y >= 0 && départ.y< longueur && arrivée.x >= 0 && arrivée.x <hauteur && arrivée.y >= 0 && arrivée.y < longueur )
               if (carte[départ.x, départ.y].est_occupée && !carte[arrivée.x, arrivée.y].est_occupée && carte[arrivée.x, arrivée.y].est_circulable)
               {
                   Personnage persotemp = carte[départ.x, départ.y].contient;
                   persotemp.pos = arrivée;
                   carte[départ.x, départ.y].retirer_perso();
                   carte[arrivée.x, arrivée.y].changer_perso(persotemp);
               }
      
       }
        public Carte(int lo,int h, Texture2D s)
        {   _longueur = lo ;
            _hauteur = h ;
            carte = new Case[longueur, hauteur];
            for (int i = 0 ; i < hauteur; ++i)
            {
                for(int j = 0 ; j < hauteur ; ++j)
                    carte[i,j] = new Case(s) ;
            }
        }
        public Case[,] acces
        {
            get { return carte; }
            set { this.carte = value; }
        }
        public void allume_zone(int rayon , Coordonées centre)
        {
            for (int j = 0; j < hauteur; j++)
            {
                for (int i = 0; i < longueur; i++)
                {
                    if (Math.Abs((centre.x - i)) + Math.Abs(centre.y - j) <= rayon)
                        carte[i, j].lumière_case = true;
                }
            }
  
        }

       static public Coordonées[] chemin(Coordonées départ, Coordonées arrivée, int vitesse, Carte map)
        {
            if (départ.x >= 0 && départ.x < map.hauteur && départ.y >= 0 && départ.y < map.longueur
                && arrivée.x >= 0 && arrivée.x < map.hauteur && arrivée.y >= 0 && arrivée.y < map.longueur)
            {
                Coordonées[] path = new Coordonées[vitesse];
                Coordonées caseCourrante = départ;
                int dX,dY ;
                int i = 0;
                while (caseCourrante != arrivée && i < vitesse)
                {
                    
                    if (arrivée.x - caseCourrante.x == 0)
                        dX = 0;
                    else dX = (arrivée.x - caseCourrante.x) / Math.Abs(arrivée.x - caseCourrante.x);

                    if (arrivée.y - caseCourrante.y == 0)
                        dY = 0;
                    else dY = (arrivée.y - caseCourrante.y) / Math.Abs(arrivée.y - caseCourrante.y);

                    if (map.acces[caseCourrante.x + dX, caseCourrante.y].est_circulable && !map.acces[caseCourrante.x + dX, caseCourrante.y].est_occupée && dX !=0)
                    {
                        path[i] = new Coordonées(dX,0);
                        i++;
                        caseCourrante.x += dX;
                    }
                    else if (map.acces[caseCourrante.x, caseCourrante.y + dY].est_circulable && !map.acces[caseCourrante.x, caseCourrante.y + dY].est_occupée && dY != 0)
                    {
                        path[i] = new Coordonées(0, dY);
                        i++;
                        caseCourrante.y += dY;
                    }
                    else
                    {
                        map.acces[caseCourrante.x, caseCourrante.y].est_circulable = false;
                        i--;
                        caseCourrante = path[i];
                    }
                }
                return path;
            }
            else return new Coordonées[vitesse]; 
        }

       public void retireCadavres()
       {
           foreach (Case c in carte)
           {
               if (c.contient != null && c.contient.vie == 0)
               {
                   Game1.soundEffect2.Play();
                   Game1.soundEffect4.Play();
                   c.retirer_perso();
                   Game1.soundEffect3.Play();
               }
           }
       }


        public int longueur
        { get { return this._longueur; } }
        public int hauteur
        { get { return this._hauteur; } }

        public void Draw(SpriteBatch spriteBatch)
     {
     int i=0, j=0;
     Vector2 position = new Vector2(400, 0);
         while (j < longueur)
     {
         while (i < hauteur)
         {
             if (carte[i, j].lumière_case)
             {
                 spriteBatch.Begin();
                 spriteBatch.Draw(carte[i, j].pic, position, Color.DarkTurquoise);
                 spriteBatch.End();
             }
             else
             {
                 spriteBatch.Begin();
                 spriteBatch.Draw(carte[i, j].pic, position, Color.White);
                 spriteBatch.End();
             }
             //if (carte[i,j].est_occupée)
             //{
             //    spriteBatch.Begin();
             //    spriteBatch.Draw(carte[i, j].contient.image, position + new Vector2(0,-41), Color.White);
             //    spriteBatch.End(); 
             //}
                     

             i += 1;
             position.X += 20;
             position.Y += 10;
         }
         j += 1;
         i = 0;
         position.X -= 20 * hauteur;
         position.Y -= 10 * hauteur;
         position.Y += 10;
         position.X -= 20;

     }
         j = 0;
         i = 0;
         position = new Vector2(400, 0);
         while (j < longueur)
         {
             while (i < hauteur)
             {
                 
                 if (carte[i, j].est_occupée)
                 {
                     spriteBatch.Begin();
                     spriteBatch.Draw(carte[i, j].contient.image, position + new Vector2( - carte[i,j].contient.slargeur,- carte[i,j].contient.shauteur), Color.White);
                     spriteBatch.End();
                 }
                 i += 1;
                 position.X += 20;
                 position.Y += 10;
             }
             j += 1;
             i = 0;
             position.X -= 20 * hauteur;
             position.Y -= 10 * hauteur;
             position.Y += 10;
             position.X -= 20;

         }
     }

        public void éteint()
        {
            foreach  ( Case c in carte)
            {
                c.lumière_case = false;
            }
        }

        public void est_allumee()
        {
            Vector2 souris = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
            double j = fonctions.fcdroite(souris, true);
            double i = fonctions.fcdroite(souris, false);
            if (j <= 0 && i <= 0)
            {
                Coordonées res = fonctions.coor(souris);
                if (res.x < hauteur && res.y < longueur)
                carte[res.x, res.y].lumière_case = true;
            }
        }
  
    }
}
